summaryrefslogtreecommitdiff
path: root/app/[lng]/admin/mdg/page.tsx
diff options
context:
space:
mode:
authorjoonhoekim <26rote@gmail.com>2025-07-07 01:19:37 +0000
committerjoonhoekim <26rote@gmail.com>2025-07-07 01:19:37 +0000
commit9945ad119686a4c3a66f7b57782750f78a366cfb (patch)
treea216f8f63094aae9198fc705afbeb55342e76a86 /app/[lng]/admin/mdg/page.tsx
parent0793ef1e3aa2232ce72debd57ba449a699e0c734 (diff)
(김준회) MDG 송신 로직에 인증 추가, soap 라이브러리 사용
Diffstat (limited to 'app/[lng]/admin/mdg/page.tsx')
-rw-r--r--app/[lng]/admin/mdg/page.tsx57
1 files changed, 43 insertions, 14 deletions
diff --git a/app/[lng]/admin/mdg/page.tsx b/app/[lng]/admin/mdg/page.tsx
index 27416f25..e2926deb 100644
--- a/app/[lng]/admin/mdg/page.tsx
+++ b/app/[lng]/admin/mdg/page.tsx
@@ -61,6 +61,7 @@ const sampleDefaults: Record<string, string> = {
E_ADDRESS: 'contact@test.vendor.com',
BP_TX_TYP: 'KR2',
TAXNUM: '123-45-67890',
+ AD_CONSNO: '1',
};
// XML escape helper
@@ -99,6 +100,25 @@ export default function MDGTestPage() {
load();
}, []);
+ // XML 생성 유틸리티 (폼 데이터 -> SOAP Envelope)
+ const buildEnvelopeXml = (currentForm: Record<string, string>, defs: VendorFieldDef[]) => {
+ if (defs.length === 0) return '';
+ const bodyContent = defs.map((f) => {
+ const val = currentForm[f.name] ?? '';
+ return `<${f.name}>${escapeXml(val)}</${f.name}>`;
+ }).join('\n ');
+
+ const supplierXml = `<SUPPLIER_MASTER>\n ${bodyContent}\n </SUPPLIER_MASTER>`;
+
+ return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:p1=\"http://shi.samsung.co.kr/P2_MD/MDZ\">\n <soap:Header/>\n <soap:Body>\n <p1:MT_P2MD3007_S>\n <P2MD3007_S>\n ${supplierXml}\n </P2MD3007_S>\n </p1:MT_P2MD3007_S>\n </soap:Body>\n</soap:Envelope>`;
+ };
+
+ // 폼 데이터 변경 시 실시간 XML 생성
+ useEffect(() => {
+ const xml = buildEnvelopeXml(formData, fieldDefs);
+ setResultXml(xml);
+ }, [formData, fieldDefs]);
+
// 폼 데이터 업데이트
const updateField = (field: string, value: string) => {
setFormData(prev => ({ ...prev, [field]: value }));
@@ -114,33 +134,42 @@ export default function MDGTestPage() {
toast.success('폼이 기본값으로 리셋되었습니다.');
};
- // 테스트 송신 실행
+ // 테스트 송신 실행 (실제 서버 호출)
const handleTestSend = async () => {
try {
setIsLoading(true);
-
+
// 필수 필드 검증
const requiredFields = fieldDefs.filter(d => d.mandatory).map(d => d.name);
const missingFields = requiredFields.filter(field => !formData[field]?.trim());
-
+
if (missingFields.length > 0) {
toast.error(`필수 필드가 누락되었습니다: ${missingFields.join(', ')}`);
+ setIsLoading(false);
return;
}
-
- // XML 생성
- const bodyContent = fieldDefs.map(f => {
- const val = formData[f.name] ?? '';
- return `<${f.name}>${escapeXml(val)}</${f.name}>`;
- }).join('\n ');
- const supplierXml = `<SUPPLIER_MASTER>\n ${bodyContent}\n </SUPPLIER_MASTER>`;
+ // 서버 API 호출해 송신
+ const res = await fetch('/api/mdg/send-vendor-xml', {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify({ envelope: resultXml }),
+ });
+
+ const json = await res.json();
+
+ if (!res.ok || !json.success) {
+ // 상세 오류 메시지 추출 (vendorCode 기반 또는 직접 오류 메시지)
+ const detailMsg = json?.results?.[0]?.error ?? json?.message ?? json?.responseText ?? '송신 실패';
+ toast.error(`송신 실패: ${detailMsg}`);
+ setIsLoading(false);
+ return;
+ }
- const envelope = `<?xml version="1.0" encoding="UTF-8"?>\n<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:p1=\"http://shi.samsung.co.kr/P2_MD/MDZ\">\n <soap:Header/>\n <soap:Body>\n <p1:MT_P2MD3007_S>\n <P2MD3007_S>\n ${supplierXml}\n </P2MD3007_S>\n </p1:MT_P2MD3007_S>\n </soap:Body>\n</soap:Envelope>`;
+ toast.success('MDG 송신이 완료되었습니다.');
- setResultXml(envelope);
- toast.success('요청 XML이 생성되었습니다. 하단 영역을 확인하세요.');
-
} catch (error) {
console.error('테스트 송신 실패:', error);
toast.error('테스트 송신 중 오류가 발생했습니다.');